package gybase02

import gybase01.Car

/*
    groovy 可以把类删掉
    例如 创建 Groovy class GyClassMethod 文件后，里面默认创建好
    class GyClassMethod {  这个可以删除
    }
 */

class NewCar {//字节码是实现GroovyObject
//    private def mile //添加private后 NewCar 字节码，没有里的get set方法
    def mile
    def year

    def getMile() {
        println"调用了 getMile  方法 mile = $mile "
        return mile
    }

    /*
       在方法前面添加private无用，因为groovy对private修饰的变量没有强制限制，
       为了让setMile私有化，两种方案：
       1、在方法里抛出异常
       2、方法里不做任何处理，空的方法


      因为默认的变量、方法都是public 直接访问变量最好的解决方案 ：在访问变量前面加@


     */

    private void setMile(mile) {
//        throw new IllegalAccessException("can not set") // 1

        println"调用了 setMile  方法 mile = $mile "
//        this.mile = mile // 2
    }

//    void execute(x,y,z){
//        println "x = $x , y = $y , z = $z"
//    }

    void execute(x = 1,y = 2,z){
        println "x = $x , y = $y , z = $z"
    }

//    NewCar(Map map) {
//    }
//
//    NewCar() {
//    }
//
//    NewCar(mile) {
//        this.mile = mile
//    }
//
//    NewCar(int mile) {
//        this.mile = mile
//    }

//    NewCar(mile, year) {
//        this.mile = mile
//        this.year = year
//    }
}

def newCar = new NewCar()
//newCar.mile = 2000
newCar.@mile = 3000 // 加上@符合，不会调用get set 方法
newCar.year = 2021
println "newCar.mile = ${newCar.@mile}"
//调用了 setMile  方法 mile = 2000
//调用了 getMile  方法 mile = 2000
//newCar.mile = 2000

println newCar.'mile'
def str = "year"
println newCar."$str"
//3000
//202


//在类的构造方法使用具名参数
//def map = [mile:5000,year:20212]
//def newcar2 = newCar(mile:5000,year:20212)
//println newCar.mile//它有先匹配的是当前Map匹配构造方法，如果匹配不到，就匹配无惨构造方法，然后调用对应的get set方法

NewCar newCar3 =new NewCar()
newCar.execute(1,2,3)
newCar.execute(1)//一个参数情况下赋值个 z


//4 方法可以设置默认的初始值 ，注意方法重载

